package lc.q1_50;

/**
 * 38. 外观数列
 *
 * 「外观数列」是一个整数序列，从数字 1 开始，序列中的每一项都是对前一项的描述。前五项如下：
 *
 * 1.     1
 * 2.     11
 * 3.     21
 * 4.     1211
 * 5.     111221
 * 1 被读作  "one 1"  ("一个一") , 即 11。
 * 11 被读作 "two 1s" ("两个一"）, 即 21。
 * 21 被读作 "one 2",  "one 1" （"一个二" ,  "一个一") , 即 1211。
 *
 * 给定一个正整数 n（1 ≤ n ≤ 30），输出外观数列的第 n 项。
 *
 * 注意：整数序列中的每一项将表示为一个字符串。
 *
 *
 */
public class Q38 {

    public String countAndSay(int n) {
        String say = "1";
        for (int i = 0; i < n-1; i++) {
            say = nextSay(say);
        }
        return say;
    }

    private String nextSay(String num) {
        StringBuilder sb = new StringBuilder();
        char c = 0;
        int count = 0;
        for (int i = 0; i < num.length(); i++) {
            final char c1 = num.charAt(i);
            if (c1 != c) {
                if (count != 0) {
                    sb.append(count);
                    sb.append(c);
                }
                count = 1;
                c = c1;
            } else {
                count ++;
            }
        }
        if (count != 0) {
            sb.append(count);
            sb.append(c);
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        final Q38 q38 = new Q38();
        System.out.println(q38.countAndSay(5));
    }

}
